package com.cskaoyan.javase.oop1._10static._1new;

/**
 *
 * 1.使用static修饰成员变量,叫做静态成员变量,它不再是属于对象独有的,而是全体对象所共享的,是属于类的
 * 2.static成员应该使用类名点访问,禁止使用对象名点.
 * 3.static成员和对象没有关系,它是属于类的,它的访问无需创建对象,也不依赖于创建对象
 * 4.static静态成员变量,和成员变量一样,具有默认值.
 *      同样,它在具有默认值的同时,还可以进行显式赋值
 *      在赋值上,和成员变量一样,仍然是先默认初始化,之后再显式赋值.
 *
 * 5.static静态成员方法,和静态成员变量的访问一样,调用它无需创建对象,也不依赖于对象,直接使用类名点调用.同类中时,可以省略类名不写,直接写方法名调用
 *
 * @since 14:54
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {

    public static void main(String[] args) {
        // Student s1 = new Student("马哥", 18);
        // Student s2 = new Student("牛哥", 19);
        // Student s3 = new Student("虎哥", 10);

        // Static member 'com.cskaoyan.javase.oop1._10static._1new.Student.schoolName' accessed via instance reference

        /*
            警告你,你正在使用对象引用访问静态成员
            换句话说: 静态成员,不应该使用对象引用访问(对象名点带有拥有的含义,但实际上静态成员不属于对象)
            正确的方法,应该是使用类名点去访问
         */
        /*System.out.println(s1.schoolName);
        System.out.println(s2.schoolName);
        System.out.println(s3.schoolName);
        s1.schoolName = "北京大学";
        System.out.println(s2.schoolName);
        System.out.println(s3.schoolName);*/
        System.out.println(Student.schoolName);
        Student.testStatic();
        testStatic();
    }


    public static void testStatic(){
        System.out.println("我是Demo类的静态成员方法");

    }

}

class Student {
    // 属性
    String name;
    String gender;
    int age;
    int id;
    static String schoolName = "王道训练营";

    // 行为
    public void eat() {
        System.out.println("我爱吃饭!");
    }

    public void study() {
        System.out.println("我爱学习!");
    }

    // 构造器 alt + insert


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void testStatic(){
        System.out.println("我是Student类的静态成员方法");
    }
}
